1. Summary
1.1 Summary table
A total of 306,021 persons have been reached by EiE activities in
2023, of which 127,370 were boys, 121,766 were girls, 43,725 were men
and 13,160.
This is a summary by indicator.
Summary statistics for EIE 5Ws reporting, 25 June 2023Indicator | Partners | Counties | June_reached1 | Total_reached | Target | %Target |
|---|
1. Access ECD spaces/schools | 12 | 14 | 7,238 | 188,406 | 1,201,151 | 15.69 |
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |
5. Educators resilience enhancing | 13 | 12 | 729 | 4,859 | 6,018 | 80.74 |
6. Children resilience enhancing | 12 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |
Total | 34 | 18 | 12,015 | 306,0212 | 2,146,5452 | 14.26 |
1Distinct number of schools not available as full list of schools is not reported |
2Only the sum of indicators 1, 2, 5 and 6 |
1.2 By sex and age

Only Indicator 6, Children benefiting from resilience-enhancing
programming sees a higher proportion of females reached over men.

1.3 By county
39.8% of all beneficiaries reached originate from Turkana, though it
only has 14.05% of the targeted population.

IPC data extracted from here.
2. Progress by indicator
2.1 Overall progress

2.2 Reached by indicator
1. Access to ECD spaces/schools
EiE Indicator 1, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
1. Access ECD spaces/schools | 12 | 14 | 7,238 | 188,406 | 1,201,151 | 15.69 |

In June 2023, 7,238 persons were reached by interventions
contributing to this indicator, of which 3,486 were boys and 3,220 were
girls.

2. School feeding programmes
EiE Indicator 2, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |

In June 2023, 1,456 persons were reached by interventions
contributing to this indicator, of which 783 were boys and 673 were
girls.

3. Teaching and learning materials
EiE Indicator 3, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys, 0 were girls, 0 were men and 0
were women.

4. Safe water, personal hygiene
EiE Indicator 4, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys and 0 and were girls.

5. Educators trained in resilience enhancing programmes
EiE Indicator 5, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
5. Educators resilience enhancing | 13 | 12 | 729 | 4,859 | 6,018 | 80.74 |

In June 2023, 729 persons were reached by interventions contributing
to this indicator, of which 474 were men and 255 and were women.

6. Children benefited from resilience enhancing programmes
EiE Indicator 6, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target |
|---|
6. Children resilience enhancing | 12 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |

In June 2023, 2,592 persons were reached by interventions
contributing to this indicator, of which 1,330 were boys and 1,262 and
were girls

3. Partners
3.1 Partners’ operational presence
Below is an interactive table which adds detail to the map above,
serving additional information for coordination – allowing interested
parties to search by county or partner.
The column activities refers to the number of Education
activities implemented by said partner in each county. Each column can
be sorted with the arrows next to each column name. Each column can also
be filtered by typing into the search bar below each column name. Only
completed activities have been included.
Download the dataset below here.
3.2 Summary by implementing partner
The table below breaks down persons reached by partner.
Summary by implementing partnerimplementing_partner | reached1 | counties | activities | %total2 |
|---|
Finn Church Aid | 187,433 | 5 | 6 | 39.08 |
Homa Bay Counties- Department of Education; MoE D | 57,020 | 1 | 1 | 11.89 |
Norwegian Refugee Council | 52,914 | 2 | 3 | 11.03 |
World Vision Kenya | 32,353 | 6 | 6 | 6.75 |
We World | 20,947 | 2 | 1 | 4.37 |
Lifeskill Promoters | 19,199 | 2 | 3 | 4.00 |
Save the Children | 19,062 | 5 | 3 | 3.97 |
WERK | 18,947 | 5 | 2 | 3.95 |
FHK | 17,974 | 2 | 4 | 3.75 |
Jesuit Refugee Service | 14,854 | 1 | 1 | 3.10 |
AVSI Foundation | 9,768 | 2 | 3 | 2.04 |
MOE | 8,241 | 1 | 2 | 1.72 |
Women Educational Researchers of Kenya, | 4,175 | 1 | 1 | 0.87 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.87 |
Nawiri Children Development Program | 3,487 | 1 | 2 | 0.73 |
Mondi | 2,197 | 1 | 1 | 0.46 |
Qatar Charity | 1,541 | 1 | 1 | 0.32 |
Bartabwa | 849 | 1 | 1 | 0.18 |
Special Olympics Kenya | 848 | 3 | 1 | 0.18 |
The Girl Child Network (GCN) | 700 | 2 | 1 | 0.15 |
CDE Mandera | 600 | 1 | 1 | 0.13 |
Frontiers Community Development Program | 491 | 1 | 1 | 0.10 |
CDE Wajir | 361 | 1 | 1 | 0.08 |
Girl Child Network | 350 | 1 | 1 | 0.07 |
ERIKs Development Partner | 249 | 1 | 1 | 0.05 |
Servants of the Poor | 202 | 1 | 1 | 0.04 |
Windle International Kenya | 196 | 1 | 1 | 0.04 |
Dignitas | 135 | 1 | 1 | 0.03 |
SMB | 135 | 1 | 1 | 0.03 |
Missionary Sisters of the Catechism | 85 | 1 | 1 | 0.02 |
Voluntary Service Overseas(VSO) | 42 | 1 | 1 | 0.01 |
Futebol da Forcaa, Moving the Goalposts -Kilifi | 40 | 1 | 1 | 0.01 |
Evangelizing Sisters of Mary | 23 | 1 | 1 | 0.00 |
IWS | 10 | 1 | 2 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
4. Schools and education level
4.1 Schools
The number of schools reached by school feeding programmes and WASH
in schools interventions to-date are:

However, reporting the overall number of schools reached by all EiE
interventions is much more challenging.
Whilst all partners working on indicators 2 and 4 submitted the
number of schools they were working in, the same is not true for the
other indicators. Only indicators 2 and 4 require the reporting of the
number of schools.
4.2 Education level
The data collected on education level is muddled: the combination of
various categories (such as ECE & Primary and
All Basic Education) hampers a clean breakdown by education
level:
Children reached by education leveleducation_level | children | %_of_total |
|---|
Primary | 247,601 | 55.04 |
ECE & Primary | 134,071 | 29.80 |
All Basic Education | 26,104 | 5.80 |
ECE | 24,084 | 5.35 |
Secondary | 17,976 | 4.00 |
Vocational | 23 | 0.01 |
Tertiary | 20 | 0.00 |
For instance, it is not possible to calculate the number of children
served from primary-level institutions.
To understand reporting around the mismatch of education-level
categories, let us examine individual indicators. In the plot below,
children reached have been broken down by education level and by
indicator. The category All Basic Education, whilst present
in all of the indicators, is most heavily used in the WASH-in-schools
intervention. Additionally, this indicator is used by 5 different
implementing partners.

5. Reference maps and tables
5.1 Reference maps
IPC data extracted from here.

5.2 Reference table
Download the EiE 5Ws data here
As a refresher for the reference table below, the indicators are:
Text of EiE indicatorsindicator |
|---|
indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas |
indicator 2 # of schools/ECD spaces with feeding programmes |
indicator 3 # of learners and teachers reached with learning and teaching materials |
indicator 4 # of schools with adequate quantites of safe water for drinking and personal hygiene |
indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCmxvY2F0aW9ucyA8LSByZWFkX3hsc3goIi4vZGF0YS9rZW5fYWRtaW5ib3VuZGFyaWVzX3RhYnVsYXJkYXRhLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICJBRE0yIikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmVpZSA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV81d3MuY3N2IikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpDQoNCnJlcG9ydF9kYXRlIDwtICIyNSBKdW5lIDIwMjMiDQoNCnJlcG9ydF9tb250aCA8LSAiSnVuZSINCg0Kc2l0cmVwX3RhYmxlIDwtIHJlYWRfeGxzeCgiLi9kYXRhL3NpdHJlcF9yZXN1bHRzX3RhYmxlLnhsc3giKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCg0KdGFyZ2V0cyA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV90YXJnZXRzLmNzdiIpDQoNCnBjb2RlMV9zaGFwZSA8LSANCiAgc2Y6OnN0X3JlYWQoIi4vZGF0YS9rZW5fYWRtX2llYmNfMjAxOTEwMzFfc2hwL2tlbl9hZG1ibmRhX2FkbTFfaWViY18yMDE5MTAzMS5zaHAiLCANCiAgICAgICAgICBxdWlldCA9IFRSVUUpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQppcGMgPC0gcmVhZF9jc3YoIi4vZGF0YS9pcGMuY3N2IikNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyAxLiBTdW1tYXJ5DQoNCiMjIDEuMSBTdW1tYXJ5IHRhYmxlDQoNCmBgYHtyfQ0Kc3VtX3N0YXRzIDwtIGVpZSAlPiUgIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoY291bnR5KSwgDQogICAgICAgICAgICByZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIG1lbiA9IHN1bShtZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHdvbWVuID0gc3VtKHdvbWVuW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBib3lzID0gc3VtKGJveXNbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBnaXJscyA9IHN1bShnaXJsc1tzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHJlYWNoZWRfMTI1NiA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFtzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCImIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoICVpbiUgcmVwb3J0X21vbnRoXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KDQpgYGANCg0KQSB0b3RhbCBvZiBgciBzdW1fc3RhdHMgJT4lIHB1bGwocmVhY2hlZF8xMjU2KSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyBoYXZlIGJlZW4gcmVhY2hlZCBieSBFaUUgYWN0aXZpdGllcyBpbiAyMDIzLCBvZiB3aGljaCBgciBzdW1fc3RhdHMgJT4lIHB1bGwoYm95cykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cywgYHIgc3VtX3N0YXRzICU+JSBwdWxsKGdpcmxzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscywgYHIgc3VtX3N0YXRzICU+JSBwdWxsKG1lbikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgbWVuIGFuZCBgciBzdW1fc3RhdHMgJT4lIHB1bGwod29tZW4pICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYC4gDQoNClRoaXMgaXMgYSBzdW1tYXJ5IGJ5IGluZGljYXRvci4gDQoNCjxicj4NCg0KYGBge3J9DQoNCg0Kc3VtbWFyeV90YWJsZSA8LSBlaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShsYXRlc3RfcmVhY2hlZCA9IGlmZWxzZShtb250aCAlaW4lIHJlcG9ydF9tb250aCwgdG90YWxfcmVhY2hlZCwgTkFfaW50ZWdlcl8pKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoYWRtMV9wY29kZSksICAgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bShsYXRlc3RfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB0b3RhbF9yZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCwsLCBsYXRlc3RfcmVhY2hlZCwgdG90YWxfcmVhY2hlZCkgJT4lIA0KICBtdXRhdGUocGFydG5lcnMgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIHN1bV9zdGF0cyRwYXJ0bmVycywgcGFydG5lcnMpLCANCiAgICAgICAgIGNvdW50aWVzID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCBzdW1fc3RhdHMkY291bnRpZXMsIGNvdW50aWVzKSwgDQogICAgICAgICB0b3RhbF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3N0YXRzJHJlYWNoZWRfMTI1NiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQpLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGF0cyRsYXRlc3RfcmVhY2hlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGNvdW50eV90YXJnZXQpKSwgDQogICAgICAgICAgICBieSA9ICJpbmRpY2F0b3Jfc2hvcnQiKSAlPiUgDQogIG11dGF0ZSh0YXJnZXQgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMgJT4lIGRpc3RpbmN0KGNvdW50eSwgY291bnR5X292ZXJhbGxfdGFyZ2V0KSAlPiUge3N1bSguJGNvdW50eV9vdmVyYWxsX3RhcmdldCl9LCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKHRvdGFsX3JlYWNoZWQgLyB0YXJnZXQgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAgc2VsZWN0KGluZGljYXRvciA9IGluZGljYXRvcl9zaG9ydCwgcGFydG5lcnMsIGNvdW50aWVzLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkLCB0b3RhbF9yZWFjaGVkLCB0YXJnZXQsIGAldGFyZ2V0YCA9IHBjKSAlPiUNCiAgc2VsZWN0X2FsbCh+IGdzdWIoImxhdGVzdCIsIA0KICAgICAgICAgICAgICAgICAgICByZXBvcnRfbW9udGgsIC4pKSAlPiUNCiAgc2VsZWN0X2FsbCh+IHN0cl90b190aXRsZSguKSkgIA0KDQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIEVJRSA1V3MgcmVwb3J0aW5nLCAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgJT4lIA0KICBmb250c2l6ZShpID0gMTo2LCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDQsIHBhcnQgPSAiaGVhZGVyIiwgcmVmX3N5bWJvbHMgPSAiMSIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkRpc3RpbmN0IG51bWJlciBvZiBzY2hvb2xzIG5vdCBhdmFpbGFibGUgYXMgZnVsbCBsaXN0IG9mIHNjaG9vbHMgaXMgbm90IHJlcG9ydGVkIikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDcsIGogPSA1OjYsIHJlZl9zeW1ib2xzID0gIjIiLCANCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJPbmx5IHRoZSBzdW0gb2YgaW5kaWNhdG9ycyAxLCAyLCA1IGFuZCA2IikpDQoNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDEuMiBCeSBzZXggYW5kIGFnZQ0KDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgbXV0YXRlKGluZGljYXRvcl9zaG9ydCA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gc3VtKC4sIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKHRvdGFsX3JlYWNoZWQgPSBib3lzICsgZ2lybHMgKyBtZW4gKyB3b21lbiwgDQogICAgICAgICBmZW1hbGUgPSAod29tZW4gKyBnaXJscykgLyB0b3RhbF9yZWFjaGVkLCANCiAgICAgICAgIG1hbGUgPSAoYm95cyArIG1lbikgLyB0b3RhbF9yZWFjaGVkKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGZlbWFsZSwgbWFsZSksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2V4IiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicGMiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gaW5kaWNhdG9yX3Nob3J0LCBmaWxsID0gc2V4KSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBwYywgDQogICAgICAgICAgICAgICAgeSA9IGluZGljYXRvcl9zaG9ydCwgDQogICAgICAgICAgICAgICAgbGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IDEpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSksIA0KICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNDQzOTgzIiwgIiMzNWI3NzkiKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiU2V4IGJyZWFrZG93biBieSBpbmRpY2F0b3IiKSAgDQoNCmBgYA0KDQo8YnI+DQoNCk9ubHkgSW5kaWNhdG9yIDYsIENoaWxkcmVuIGJlbmVmaXRpbmcgZnJvbSByZXNpbGllbmNlLWVuaGFuY2luZyBwcm9ncmFtbWluZyBzZWVzIGEgaGlnaGVyIHByb3BvcnRpb24gb2YgZmVtYWxlcyByZWFjaGVkIG92ZXIgbWVuLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplaWUgJT4lIA0KICBtdXRhdGVfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhtZW4sIHdvbWVuLCBib3lzLCBnaXJscyksIH4gc3VtKC4pKSAlPiUgDQogIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMobWVuLCB3b21lbiwgYm95cywgZ2lybHMpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyZWFjaGVkIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IHN0cl90b190aXRsZSh0eXBlKSwgDQogICAgICAgICB0eXBlID0gZmN0X3JlbGV2ZWwodHlwZSwgYygiTWVuIiwgIldvbWVuIiwgIkJveXMiLCAiR2lybHMiKSkpICU+JSANCiAgIyBZb3UncmUganVzdCBmaWx0ZXJpbmcgdGhlbSBvdXQgbWFudWFsbHkNCiAgbXV0YXRlKHJlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiB0eXBlID09ICJCb3lzIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgdHlwZSA9PSAiR2lybHMiIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJNZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJXb21lbiIgfiAwLCANCiAgICBUUlVFIH4gcmVhY2hlZA0KICApKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IHR5cGUsIHggPSByZWFjaGVkLCBmaWxsID0gdHlwZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHJlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxIC8gMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4yLCBlbmQgPSAuOSkgKyANCiAgZmFjZXRfd3JhcCh+IGluZGljYXRvcl9zaG9ydCwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIGxhYnMoeCA9ICJSZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJSZWFjaCBkaXNhZ2dyZWdhdGVkIGJ5IHNleCBhbmQgYWdlIiwgDQogICAgICAgc3VidGl0bGUgPSAiRXhjbHVkZXMgc29tZSBpbmNvcnJlY3QgcmVwb3J0aW5nIHVuZGVyIGluZGljYXRvcnMgNSBhbmQgNiIpDQoNCg0KYGBgDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyAxLjMgQnkgY291bnR5DQoNCmBgYHtyfQ0KY3VtX3BjPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKHBjX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX3RhcmdldCA9IHJvdW5kKHRhcmdldCAvIHN1bSh0YXJnZXQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGN1bV9wYyA9IGN1bXN1bShwY19iZW4pKQ0KYGBgDQoNCmByIGN1bV9wYyAlPiUgZmlsdGVyKGNvdW50eSA9PSAiVHVya2FuYSIpICU+JSBwdWxsKGN1bV9wYylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkIG9yaWdpbmF0ZSBmcm9tIFR1cmthbmEsIHRob3VnaCBpdCBvbmx5IGhhcyBgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChwY190YXJnZXQpYCUgb2YgdGhlIHRhcmdldGVkIHBvcHVsYXRpb24uIA0KDQo8YnI+DQoNCmBgYHtyfQ0KDQplaWUgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlLCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lICANCiAgbXV0YXRlKGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgc2VjdG9yX3JlYWNoZWQpKSAlPiUgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIGxlZnRfam9pbihpcGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtMV9wY29kZSwgcGVyY2VudF9waGFzZV9wMyksIA0KICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHNlY3Rvcl9yZWFjaGVkLCB0YXJnZXQpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBpZmVsc2UodHlwZSA9PSAidGFyZ2V0IiwgIkNvdW50eSBUYXJnZXQiLCAiU2VjdG9yIFJlYWNoZWQiKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodmFsdWUgPSAwKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHZhbHVlLCANCiAgICAgICAgICAgICB5ID0gY291bnR5LCANCiAgICAgICAgICAgICBmaWxsID0gcGVyY2VudF9waGFzZV9wMykpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHZhbHVlKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxLzEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50KSArIA0KICBmYWNldF9ncmlkKH4gdHlwZSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArIA0KICBsYWJzKGZpbGwgPSAiJSBJUEMzKyIsDQogICAgICAgeCA9ICJUYXJnZXQvcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgY2FwdGlvbiA9ICJDb2xvdXJzIHJlZmVyIHRvICUgb2YgY291bnR5IHBvcHVsYXRpb24gaW4gSVBDIHBoYXNlIDMgb3IgYWJvdmUuIEhvbWEgQmF5IHdhcyBub3QgYXNzZXNzZWQgYXMgcGFydCBvZiB0aGUgSVBDIENsYXNzaWZpY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIHRhcmdldHMgYW5kIHJlYWNoZWQiKSArDQogIHRoZW1lKCMgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgICMgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQpgYGANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjIxMC8/aXNvMz1LRU4pLg0KDQo8YnI+PGJyPjxicj4NCg0KDQoNCiMgMi4gUHJvZ3Jlc3MgYnkgaW5kaWNhdG9yDQoNCiMjIDIuMSBPdmVyYWxsIHByb2dyZXNzDQoNCg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQoNCmxpbmVfdmFsdWVzIDwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG5hbWVfdG9fZGF0ZShtb250aCkpICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcl9zaG9ydCkgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGluZGljYXRvcl9zaG9ydCkpICsgDQogIGdlb21fc3RlcChzaXplID0gMSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIHggPSAtSW5mLCB5ID0gSW5mLCBoanVzdCA9IC0wLjE1LCB2anVzdCA9IDAuOSwgZGF0YSA9IGxpbmVfdmFsdWVzKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBmYWNldF93cmFwKH5pbmRpY2F0b3Jfc2hvcnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBpbnRlcnZlbnRpb25zIiwgDQogICAgICAgdGl0bGUgPSBwYXN0ZTAoIk1vbnRobHkgcHJvZ3Jlc3MgYnkgYWN0aXZpdHksICIsIHJlcG9ydF9kYXRlKSwNCiAgICAgICBzdWJ0aXRsZSA9ICJJbmRpY2F0b3Igc3VidG90YWwgaW4gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoIGZhY2V0IikgDQogIA0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyAyLjIgUmVhY2hlZCBieSBpbmRpY2F0b3INCg0KYGBge3J9DQpiZW5fcGxvdCA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGNvdW50eSkpICsgDQogICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBwYykpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcyksIGhqdXN0ID0gImlud2FyZCIpLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50LCBiZWdpbiA9IC4yKSArIA0KICAgIGxhYnModGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgICB4ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICAgIHkgPSAiIiwgDQogICAgICAgICBmaWxsID0gIiUgcmVhY2hlZCIpIA0KfQ0KDQpwY19wbG90IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGNvdW50eSkpICsgDQogICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBwYykpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gLjEpLCBoanVzdCA9ICJpbndhcmQiKSwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiKSArIA0KICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50LCBiZWdpbiA9IC4yKSArIA0KICAgIGxhYnModGl0bGUgPSAiJSBvZiB0YXJnZXQgcmVhY2hlZCIsIA0KICAgICAgICAgeCA9ICIlIHJlYWNoZWQiLCANCiAgICAgICAgIHkgPSAiIiwgDQogICAgICAgICBmaWxsID0gIiUgcmVhY2hlZCIpICsNCiAgICANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQp9DQpgYGANCg0KYGBge3J9DQp0YXJnZXRzX3JhbmdlIDwtIHRhcmdldHMgJT4lIA0KICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHRhcmdldCA9IHN1bShjb3VudHlfdGFyZ2V0LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbmRpY2F0b3Jfc2hvcnQsIHZhbHVlc19mcm9tID0gdGFyZ2V0KSAlPiUgDQogIHNldE5hbWVzKGMoImNvdW50eSIsICJpbmRpY2F0b3IxIiwgImluZGljYXRvcjIiLCAiaW5kaWNhdG9yMyIsICJpbmRpY2F0b3I0IiwgDQogICAgICAgICAgICAgImluZGljYXRvcjUiLCAiaW5kaWNhdG9yNiIpKQ0KDQppbmRpY2F0b3JfbWFwIDwtIGZ1bmN0aW9uKHRibCwgaW5kaWNhdG9yX251bWJlciwgcGxvdF9vcHRpb24pIHsNCiAgDQogIHBsb3Rfb3B0aW9uIDwtIGVucXVvKHBsb3Rfb3B0aW9uKQ0KICBpbmRpY2F0b3JfbnVtYmVyIDwtIGVucXVvKGluZGljYXRvcl9udW1iZXIpDQogIA0KICB0YmwgJT4lIA0KICAgIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgISFpbmRpY2F0b3JfbnVtYmVyKSkgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICEhaW5kaWNhdG9yX251bWJlcikpICU+JQ0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwIHwgY291bnR5X3RhcmdldCA+IDApICAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgbmFuaWFyOjpyZXBsYWNlX3dpdGhfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSANCiAgICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHkgPSBhZG0xX2VuLCBhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSANCiAgICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgYnkgPSBjKCJhZG0xX3Bjb2RlIikpICU+JQ0KICAgIHN0X2FzX3NmKCkgJT4lIA0KICAgIGdncGxvdCgpICsgDQogICAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgICBhZXMoZmlsbCA9ICEhcGxvdF9vcHRpb24pKSArIA0KICAgIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYSghIXBsb3Rfb3B0aW9uKSksDQogICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLA0KICAgICAgICAgICAgICAgICBzaXplID0gMi41KSArIA0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICAgIHRoZW1lX3ZvaWQoKSArIA0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQogICAgDQp9DQoNCmBgYA0KDQojIyMgMS4gQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scw0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIxIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDEsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxLCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMSksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMS4gQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBDaGlsZHJlbiBhY2Nlc3NpbmcgRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4gU2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcw0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIyIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDIsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxLCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiMiIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiMiIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjIpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIFNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIEZlZWRpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMy4gVGVhY2hpbmcgYW5kIGxlYXJuaW5nIG1hdGVyaWFscw0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIzIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDMsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxLCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiMyIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiMyIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjMpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjMuIFRlYWNoaW5nIGFuZCBsZWFybmluZyBtYXRlcmlhbHMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMsICBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRtZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR3b21lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgd29tZW4uIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMy4gVGVhY2hpbmcgbWF0ZXJpYWxzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNC4gU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZQ0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI0IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDQsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxLCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNCIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjQpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscy4gDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDUuIEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA1LCBhcyBvZiAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgJT4lIA0KICBmb250c2l6ZShpID0gMSwgaiA9IDEsIHNpemUgPSA5KSAlPiUgDQogIGZvbnRzaXplKHNpemUgPSA5LCBwYXJ0ID0gImhlYWRlciIpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjUiLCBjb3VudHlfdGFyZ2V0KSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hLnZhbHVlID0gImdyZXk4MCIsIGxpbWl0cyA9IHJhbmdlKGMoMCwgMTgxMykpKSArIA0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI1IiwgYmVuZWZpY2lhcmllcykgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNS4gRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRtZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR3b21lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIHdvbWVuLiANCg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI1LiBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDYuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNiIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA2LCBhcyBvZiAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgJT4lIA0KICBmb250c2l6ZShpID0gMSwgaiA9IDEsIHNpemUgPSA5KSAlPiUgDQogIGZvbnRzaXplKHNpemUgPSA5LCBwYXJ0ID0gImhlYWRlciIpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3I2KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI2LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciByZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscyANCg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI2LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIFBhcnRuZXJzDQoNCiMjIDMuMSBQYXJ0bmVycycgb3BlcmF0aW9uYWwgcHJlc2VuY2UNCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTd9DQoNCnBhcnRuZXJfbWFwIDwtIGVpZSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBsZWFkX29yZ2FuaXNhdGlvbiA9IG5fZGlzdGluY3QobGVhZF9vcmdhbmlzYXRpb24pLA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSwgDQogICAgICAgICAgICB3b21lbiA9IHN1bSh3b21lblthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbWVuID0gc3VtKG1lblthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGJveXMgPSBzdW0oYm95c1thY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdpcmxzID0gc3VtKGdpcmxzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUocmVhY2hlZCA9IG1lbiArIHdvbWVuICsgYm95cyArIGdpcmxzLCANCiAgICAgICAgIG1hbGUgPSBtZW4gKyBib3lzLCANCiAgICAgICAgIGZlbWFsZSA9IHdvbWVuICsgZ2lybHMsIA0KICAgICAgICAgbWFsZV9wYyA9IHJvdW5kKG1hbGUgLyByZWFjaGVkICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBmZW1hbGVfcGMgPSByb3VuZChmZW1hbGUgLyByZWFjaGVkICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBtdXRhdGUocGFydG5lcnNfY29sb3VyID0gcGFydG5lcnMgKyBydW5pZigxLCBtaW4gPSAtLjEsIG1heCA9IC4xKSkgJT4lIA0KICBsZWZ0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgZGF0YSA9IHBjb2RlMV9zaGFwZSkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwYXJ0bmVycywgDQogICAgICAgICAgICAgIGNvbG91ciA9IGFkbTFfcGNvZGUpKSArIA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKCANCiAgICBjb3VudHksICJcbiIsIHBhcnRuZXJzKSwgDQogICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgNCiAgICAgICAgICAgICAgICAiQ291bnR5OiAiLCBjb3VudHksICJcbiIsIA0KICAgICAgICAgICAgICAgICJQYXJ0bmVyczogIiwgcGFydG5lcnMsICJcbiIsIA0KICAgICAgICAgICAgICAgICJSZWFjaGVkOiAiLCBjb21tYShzZWN0b3JfcmVhY2hlZCksICJcbiIsIA0KICAgICAgICAgICAgICAgICJGZW1hbGVfcmVhY2hlZCU6ICIsIGZlbWFsZV9wYywgIiUiLCAiXG4iLCANCiAgICAgICAgICAgICAgICAiTWFsZV9yZWFjaGVkJTogIiwgbWFsZV9wYywgIiUiKSksIA0KICAgICAgICAgICAgICAgIHNpemUgPSAzLCBjb2xvdXIgPSAiZ3JheTQwIikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxLCAzLCA1LCA3LCA5LCAxMSkpICsgDQogIA0KICB0aGVtZV92b2lkKCkgKyANCiAgIyBSZW1lbWJlciB0aGF0IHlvdSBuZWVkIGd1aWRlX2NvbG9yYmFyLCBub3QgZ3VpZGVfbGVnZW5kDQogICMgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihyZXZlcnNlID0gVFJVRSkpICsgDQogIGxhYnModGl0bGUgPSAiS0VOWUE6IEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIG9wZXJhdGlvbmFsIHByZXNlbmNlIiwgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgZmlsbCA9ICJQYXJ0bmVycyIpDQoNCg0KZ2dwbG90bHkocGFydG5lcl9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKHN1bV9zdGF0cyRwYXJ0bmVycywgIiBFaUUgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGFjcm9zcyAiLCBzdW1fc3RhdHMkY291bnRpZXMsICIgY291bnRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBvZiAiLCByZXBvcnRfZGF0ZSwgIjsgbW91c2Ugb3ZlciBjb3VudHkgbmFtZSBmb3IgbW9yZSBkZXRhaWxzIiwgIjwvc3VwPiIpKSkNCmBgYA0KDQoNCjxicj4NCg0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgdGFibGUgd2hpY2ggYWRkcyBkZXRhaWwgdG8gdGhlIG1hcCBhYm92ZSwgc2VydmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBjb29yZGluYXRpb24gLS0gYWxsb3dpbmcgaW50ZXJlc3RlZCBwYXJ0aWVzIHRvIHNlYXJjaCBieSBjb3VudHkgb3IgcGFydG5lci4gDQoNCiBUaGUgY29sdW1uIGBhY3Rpdml0aWVzYCByZWZlcnMgdG8gdGhlIG51bWJlciBvZiBFZHVjYXRpb24gYWN0aXZpdGllcyBpbXBsZW1lbnRlZCBieSBzYWlkIHBhcnRuZXIgaW4gZWFjaCBjb3VudHkuIEVhY2ggY29sdW1uIGNhbiBiZSBzb3J0ZWQgd2l0aCB0aGUgYXJyb3dzIG5leHQgdG8gZWFjaCBjb2x1bW4gbmFtZS4gRWFjaCBjb2x1bW4gY2FuIGFsc28gYmUgZmlsdGVyZWQgYnkgdHlwaW5nIGludG8gdGhlIHNlYXJjaCBiYXIgYmVsb3cgZWFjaCBjb2x1bW4gbmFtZS4gT25seSBjb21wbGV0ZWQgYWN0aXZpdGllcyBoYXZlIGJlZW4gaW5jbHVkZWQuDQogDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uLCByZWFjaGVkLCBgI2FjdGl2aXRpZXNgID0gYWN0aXZpdGllcywgYWRtMV9wY29kZSkgJT4lIA0KICB3cml0ZV9jc3YoIi4vZGF0YS9icmVha2Rvd25fYnlfY291bnR5X3BhcnRuZXIuY3N2IikNCmBgYA0KIA0KDQpEb3dubG9hZCB0aGUgZGF0YXNldCBiZWxvdyBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2JyZWFrZG93bl9ieV9jb3VudHlfcGFydG5lci5jc3YpLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uLCByZWFjaGVkLCBgI2FjdGl2aXRpZXNgID0gYWN0aXZpdGllcywgYWRtMV9wY29kZSkgJT4lIA0KICBzZWxlY3RfYWxsKC4sIH4gc3RyX3RvX3RpdGxlKC4pKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGNvdW50eSBhbmQgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygiUmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoIlJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuMiBTdW1tYXJ5IGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyDQoNClRoZSB0YWJsZSBiZWxvdyBicmVha3MgZG93biBwZXJzb25zIHJlYWNoZWQgYnkgcGFydG5lci4gDQoNCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCkpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoYWRtMV9wY29kZSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBmaWx0ZXIocmVhY2hlZCA+IDApICU+JSANCiAgbXV0YXRlKGAldG90YWxgID0gcm91bmQocmVhY2hlZCAvIHN1bShyZWFjaGVkKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlYWNoZWQpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJTdW1tYXJ5IGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjkpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSAyLCByZWZfc3ltYm9scyA9ICIxIiwgcGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIkFsbCBpbmRpY2F0b3JzIGFzIG9wcG9zZWQgb25seSBpbmRpY2F0b3JzIDEsIDIsIDUgYW5kIDYiKSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDUsIHJlZl9zeW1ib2xzID0gIjIiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiUGVyY2VudGFnZSBvZiByZWFjaGVkIGZvciBhbGwgaW5kaWNhdG9ycyIpKQ0KDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMgNC4gU2Nob29scyBhbmQgZWR1Y2F0aW9uIGxldmVsDQoNCiMjIDQuMSBTY2hvb2xzDQoNClRoZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IHNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyBpbnRlcnZlbnRpb25zIHRvLWRhdGUgYXJlOiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY2hvb2xzKSkgJT4lDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDQiKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKHNjaG9vbHMgPSBzdW0oc2Nob29scyksIA0KICAgICAgICAgICAgcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9zY2hvb2xzID0gY3Vtc3VtKHNjaG9vbHMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fc2Nob29scyksIA0KICAgICAgICAgdmp1c3QgPSAtLjUpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuNywgDQogICAgICAgICAgICBhZXMoY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGN1bV9zY2hvb2xzKSksIHZqdXN0ID0gLS41KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzMxNjg4ZSIsICIjZDg1NzZiIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIlNjaG9vbHMgcmVhY2hlZCBieSBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyIsIA0KICAgICAgIGNvbG91ciA9ICJJbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIHJlcG9ydGluZyB0aGUgb3ZlcmFsbCBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IGFsbCBFaUUgaW50ZXJ2ZW50aW9ucyBpcyBtdWNoIG1vcmUgY2hhbGxlbmdpbmcuDQoNCldoaWxzdCBhbGwgcGFydG5lcnMgd29ya2luZyBvbiBpbmRpY2F0b3JzIDIgYW5kIDQgc3VibWl0dGVkIHRoZSBudW1iZXIgb2Ygc2Nob29scyB0aGV5IHdlcmUgd29ya2luZyBpbiwgdGhlIHNhbWUgaXMgbm90IHRydWUgZm9yIHRoZSBvdGhlciBpbmRpY2F0b3JzLiBPbmx5IGluZGljYXRvcnMgMiBhbmQgNCByZXF1aXJlIHRoZSByZXBvcnRpbmcgb2YgdGhlIG51bWJlciBvZiBzY2hvb2xzLiANCg0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDQuMiBFZHVjYXRpb24gbGV2ZWwgDQoNClRoZSBkYXRhIGNvbGxlY3RlZCBvbiBlZHVjYXRpb24gbGV2ZWwgaXMgbXVkZGxlZDogdGhlIGNvbWJpbmF0aW9uIG9mIHZhcmlvdXMgY2F0ZWdvcmllcyAoc3VjaCBhcyBgRUNFICYgUHJpbWFyeWAgYW5kIGBBbGwgQmFzaWMgRWR1Y2F0aW9uYCkgaGFtcGVycyBhIGNsZWFuIGJyZWFrZG93biBieSBlZHVjYXRpb24gbGV2ZWw6IA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoZ2lybHMsIGJveXMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShlZHVjYXRpb25fbGV2ZWwpKSAlPiUgDQogIG11dGF0ZShjaGlsZHJlbiA9IGJveXMgKyBnaXJscykgJT4lIA0KICBncm91cF9ieShlZHVjYXRpb25fbGV2ZWwpICU+JSANCiAgc3VtbWFyaXNlKGNoaWxkcmVuID0gc3VtKGNoaWxkcmVuKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoY2hpbGRyZW4pKSAlPiUgDQogIG11dGF0ZShgJV9vZl90b3RhbGAgPSByb3VuZChjaGlsZHJlbiAvIHN1bShjaGlsZHJlbikgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJDaGlsZHJlbiByZWFjaGVkIGJ5IGVkdWNhdGlvbiBsZXZlbCIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KYGBgDQoNCjxicj4NCg0KRm9yIGluc3RhbmNlLCBpdCBpcyBub3QgcG9zc2libGUgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gc2VydmVkIGZyb20gcHJpbWFyeS1sZXZlbCBpbnN0aXR1dGlvbnMuIA0KDQpUbyB1bmRlcnN0YW5kIHJlcG9ydGluZyBhcm91bmQgdGhlIG1pc21hdGNoIG9mIGVkdWNhdGlvbi1sZXZlbCBjYXRlZ29yaWVzLCBsZXQgdXMgZXhhbWluZSBpbmRpdmlkdWFsIGluZGljYXRvcnMuIEluIHRoZSBwbG90IGJlbG93LCBjaGlsZHJlbiByZWFjaGVkIGhhdmUgYmVlbiBicm9rZW4gZG93biBieSBlZHVjYXRpb24gbGV2ZWwgYW5kIGJ5IGluZGljYXRvci4gVGhlIGNhdGVnb3J5IGBBbGwgQmFzaWMgRWR1Y2F0aW9uYCwgd2hpbHN0IHByZXNlbnQgaW4gYWxsIG9mIHRoZSBpbmRpY2F0b3JzLCBpcyBtb3N0IGhlYXZpbHkgdXNlZCBpbiB0aGUgV0FTSC1pbi1zY2hvb2xzIGludGVydmVudGlvbi4gQWRkaXRpb25hbGx5LCB0aGlzIGluZGljYXRvciBpcyB1c2VkIGJ5IDUgZGlmZmVyZW50IGltcGxlbWVudGluZyBwYXJ0bmVycy4gDQoNCjxicj4NCg0KYGBge3J9DQoNCg0KZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoZ2lybHMsIGJveXMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShlZHVjYXRpb25fbGV2ZWwpKSAlPiUgDQogIG11dGF0ZShyZWFjaGVkID0gYm95cyArIGdpcmxzICsgbWVuICsgd29tZW4pICU+JSANCiAgZ3JvdXBfYnkoZWR1Y2F0aW9uX2xldmVsLCBpbmRpY2F0b3Jfc2hvcnQpICU+JQ0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShyZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShyZWFjaGVkKSkgJT4lICANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHBjID0gcmVhY2hlZCAvIHRvdGFsLCANCiAgICAgICAgIGluZGljYXRvcl9zaG9ydCA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGluZGljYXRvcl9zaG9ydCwgZmlsbCA9IGVkdWNhdGlvbl9sZXZlbCkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gcGMsIA0KICAgICAgICAgICAgICAgIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIA0KICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAxKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbi1sZXZlbCBicmVha2Rvd24gYnkgaW5kaWNhdG9yIiwgDQogICAgICAgZmlsbCA9ICIiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCg0KDQoNCg0KDQojIDUuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMgDQoNCiMjIDUuMSBSZWZlcmVuY2UgbWFwcyANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjIxMC8/aXNvMz1LRU4pLiANCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEwfQ0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG51bWJlcl9waGFzZV9wMykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShudW1iZXJfcGhhc2VfcDMpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIkF0IGxlYXN0XG5waGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIHBlcnNvbnMgSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsgDQoNCmlwYyAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGVyY2VudF9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQyBwaGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBwb3B1bGF0aW9uIElQQyBQaGFzZSAzIG9yIGFib3ZlIiwgDQogICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBodHRwczovL3d3dy5pcGNpbmZvLm9yZy8iKSArDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBzZWN0b3JfcmVhY2hlZCkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShzZWN0b3JfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yLA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzM5NDgzKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJTZWN0b3JcbnJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJSZWFjaGVkIHBlcnNvbnMiKSArIA0KICANCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHJlYWNoZWQgPSAwLCB0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUocGMgPSBpZmVsc2UodGFyZ2V0ID09IDAsIDAsIHJlYWNoZWQgLyB0YXJnZXQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgb2YgdGFyZ2V0IiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBvdmVyYWxsIGNvdW50eSB0YXJnZXQgcmVhY2hlZCIpICsgICANCg0KcGxvdF9sYXlvdXQobmNvbCA9IDIsIA0KICAgICAgICAgICAgbnJvdyA9IDIpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDUuMiBSZWZlcmVuY2UgdGFibGUgDQoNCkRvd25sb2FkIHRoZSBFaUUgNVdzIGRhdGEgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9ibG9iL21haW4vZGF0YS9laWVfNXdzLmNzdikNCg0KQXMgYSByZWZyZXNoZXIgZm9yIHRoZSByZWZlcmVuY2UgdGFibGUgYmVsb3csIHRoZSBpbmRpY2F0b3JzIGFyZTogDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZGlzdGluY3QoaW5kaWNhdG9yKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJUZXh0IG9mIEVpRSBpbmRpY2F0b3JzIikgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyh3aWR0aCA9IC44LCBsYXlvdXQgPSAiYXV0b2ZpdCIpDQoNCmBgYA0KDQo8YnI+DQoNCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCksIA0KICAgICAgICAgaW5kaWNhdG9yX251bWJlciA9IHBhcnNlX251bWJlcihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgaW5kaWNhdG9yX251bWJlcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3IgPSBpbmRpY2F0b3JfbnVtYmVyLCByZWFjaGVkLCBhZG0xX3Bjb2RlKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGluZGljYXRvciwgY291bnR5IGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygicmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==